
//声明构造函数
function Promise(executor){

    //为实例对象添加属性(this)
    //添加属性
    this.PromiseState="pending";
    this.PromiseResult=null;

    //声明属性
    this.callbacks=[];

    //预先保存实例对象的this值
    const self=this; //常见形式命名:that,self,_this

    //resolve函数
    function resolve(data){

        //这里的this指向的是window
        //console.log(this);//所以这里直接用this赋值,改的并不是实例对象,而是全局的window对象

            //判断状态
            if(self.PromiseState !== "pending") return;
        
            //1.修改对象的状态(promiseState)
            self.PromiseState="fulfilled"; //resolved
            //2.修改对象结果值 (promiseResult)
            self.PromiseResult=data;
            //调用成功的回调函数  ???
            self.callbacks.forEach(item=>{
                item.onResolved(data);
            });

    }

    //reject函数
    function reject(data){

            //判断状态
            if(self.PromiseState !== "pending") return;
            //1.修改对象的状态(promiseState)
            self.PromiseState="rejected";        
            //2.修改对象结果值 (promiseResult)
            self.PromiseResult=data;

             //调用失败的回调函数
             self.callbacks.forEach(item=>{
                 item.onRejected(data);
             });
    }

    try{
         //同步调用【执行器函数】
        executor(resolve,reject);
    }catch(e){
        //修改Promise对象的状态为【失败】
        reject(e);
    }
   
}

//添加then方法
Promise.prototype.then=function(onResolved,onRejected){

    return new Promise((resolve,reject)=>{

        if(this.PromiseState === 'fulfilled'){
            try{
                 //获取回调函数的执行结果
                let result=onResolved(this.PromiseResult);
                //判断是否是Promise对象
                if(result instanceof Promise){
                    //如果是Promise类型对象
                    result.then(v=>{
                        resolve(v);
                    },r=>{
                        reject(r);
                    });
                }else{
                    //结果的对象状态为【成功】
                    resolve(result);
                }
            }catch(e){
                reject(e);
            }
           
        }

        if(this.PromiseState === 'rejected'){
            onRejected(this.PromiseResult);
        }

        //判断pending的状态
        if(this.PromiseState === 'pending'){
            //保存回调函数
            this.callbacks.push( {
                onResolved,
                onRejected
            });
        }

    });

  
    
}